TD3 & SAC


本节我们介绍 TD3(Twin Delayed DDPG)和 SAC(Soft Actor-Critic)。

Twin Delayed DDPG

我们在 DQN及其变种 中讲到了 DDPG,它是 DQN 在连续动作空间中扩展。DDPG 通常可以取得非常好的表现,但它对超参数非常敏感。DDPG 通常会在训练初期大大高估状态的 Q 值。 Twin Delayed DDPG (TD3) 通过引入了三个技巧缓解了了这个问题:

  • 技巧1:使用 clip 版本的 double Q-Learning,在 TD3 中有两个 Q 网络,并且每个 Q 网络都有对应的一个 target 网络,因此一共有 4 个Q网络;
  • 技巧2:使用延迟的策略更新;
  • 技巧3:DDPG 中策略是固定策略,可以使用贪心策略,TD3 中是直接给原来的策略加入噪声;

策略网络定义

在 DDPG 中在得到最佳动作时采用的是固定策略:$\mu_\theta(s)$,探索时可以采用 $\epsilon$ 贪心策略。在TD3中采用是带有高斯噪声的策略,并且使用了 clip 操作,增加算法的稳定性,公式如下:

$$\mu_{\theta’}(s’)=\operatorname{clip}\left(\mu_{\theta’}\left(s^{\prime}\right)+\operatorname{clip}(\epsilon,-c, c), a_{L o w}, a_{H i g h}\right), \quad \epsilon \sim \mathcal{N}(0, \sigma) \tag{1}$$

策略网络的更新

更新策略网络时,只使用 $Q_{\phi1}$ 进行更新,其目标是:

$$\max_{\theta} \sum\nolimits_{i}Q_{\phi1}(s_i,\mu_{\theta}(s_i))$$

使用梯度上升,因此迭代公式为:

$$\theta \leftarrow \theta+\beta \sum\nolimits_{i} \frac{d Q_{\phi1} \left({s}_{i}, {a}\right)}{d {a}}\frac{d \mu_\theta \left({s}_{i}\right)}{d \theta}$$

Q网络目标的计算

在计算 target 的过程中,取两个 target-Q 网络中输出最小的作为 Q 值,这么做的目的是避免过分的估计 Q 值。

$$y\left(s,a\right)=r(s,a)+\gamma\min \big(Q_{\phi1’}\left(s^{\prime}, \mu_{\theta’}\left(s^{\prime}\right), Q_{\phi2 ‘}\left(s^{\prime}, \mu_{\theta’}\left(s^{\prime}\right) \right)\right) \big) \tag{2}$$

Q网络的更新

两个 Q 网络 $Q_{\phi1},Q_{\phi2}$$ 更新都使用同一个 target: $y(s,a)$,其目标是:

$$\begin{aligned} \min_{\phi1}\frac{1}{2} \sum_{i}\left|Q_{\phi1}\left(s_{i}, a_{i}\right)-y\left(s_{i}, a_{i}\right)\right|^{2} \\ \min_{\phi2}\frac{1}{2} \sum_{i}\left|Q_{\phi2}\left(s_{i}, a_{i}\right)-y\left(s_{i}, a_{i}\right)\right|^{2} \end{aligned}$$

使用梯度下降,因此迭代公式为:

$$\begin{aligned} \phi_1\leftarrow\phi_1-\alpha\sum\nolimits_{i} \frac{dQ_{\phi1}(s_i,a_i)}{d\phi_1}(Q_{\phi1}(s_i,a_i)-y(s_i,a_i)) \\ \phi_2\leftarrow\phi_2-\alpha\sum\nolimits_{i} \frac{dQ_{\phi2}(s_i,a_i)}{d\phi_2}(Q_{\phi2}(s_i,a_i)-y(s_i,a_i)) \end{aligned} $$

TD3 相当于 DDPG 的改进版本,下面直接给出算法大致流程。

TD3算法流程

  1. 初始化6个网络:$Q_{\phi1},Q_{\phi1’},Q_{\phi2},Q_{\phi2’},\mu_{\theta},\mu_{\theta’}$,令 $\phi1’ \leftarrow \phi1, \phi2’ \leftarrow \phi2,\theta’ \leftarrow \theta$。
  2. 观察当前状态,使用 $\mu_{\theta}(s)$ 采集一个状态-动作-回报对 $\{s,a,r,s’\}$,并把这个样本加入 buffer-$\mathcal{B}$,令 $n\leftarrow 0$
  3. 从 $\mathcal{B}$ 中采集一个batch,$\{s_i,a_i,r_i,s’_{i}\}$,$n \leftarrow n+1$
  4. 同时使用 $Q_{\phi1},Q_{\phi2}$,计算 target $$y\left(s_i,a_i\right)=r(s_i,a_i)+\gamma\min \big(Q_{\phi1’}\left(s^{\prime}, \mu_{\theta’}\left(s^{\prime}\right), Q_{\phi2 ‘}\left(s^{\prime}, \mu_{\theta’}\left(s^{\prime}\right) \right)\right) \big)$$
  5. 更新两个Q网络: $$\begin{aligned} \phi_1\leftarrow\phi_1-\alpha\sum\nolimits_{i} \frac{dQ_{\phi1}(s_i,a_i)}{d\phi_1}(Q_{\phi1}(s_i,a_i)-y(s_i,a_i)) \\ \phi_2\leftarrow\phi_2-\alpha\sum\nolimits_{i} \frac{dQ_{\phi2}(s_i,a_i)}{d\phi_2}(Q_{\phi2}(s_i,a_i)-y(s_i,a_i)) \end{aligned} $$
  6. 如果 $n\neq N$,返回3,否则继续执行
  7. 更新策略网络 $\mu_{\theta}$,只使用 $Q_{\phi1}$ $$\theta \leftarrow \theta+\beta \sum\nolimits_{i} \frac{d Q_{\phi1} \left({s}_{i}, {a}\right)}{d {a}}\frac{d \mu_\theta \left({s}_{i}\right)}{d \theta} $$
  8. 利用 Polyak Averaging 更新 $\phi1^{\prime},\phi2^{\prime},\theta’$ $$\begin{aligned} \phi1’ &\leftarrow \rho\phi1’+(1-\rho)\phi1 \\ \phi2’ &\leftarrow \rho\phi2’+(1-\rho)\phi2 \\ \theta’ &\leftarrow \rho\theta’+(1-\rho)\theta \end{aligned}$$
  9. 返回2,直到所有网络收敛

Soft Actor-Critic

SAC 几乎和 TD3 同时提出,但他们思路有些类似,SAC 有一个策略网络 $\pi_\theta$、两个Q网络 $Q_{\phi1},Q_{\phi2}$,和一个值函数网络 $V_{\psi}$ 以及值函数的 target 网络 $V_{\psi’}$。SAC 中使用两个 Q 网络去准确估计值函数 V(参考以下公式5);使用一个 V 网络去准确估计 Q 值;使用精确的 Q 值去迭代策略网络。SAC 中还引入了熵作为正则项。下面先给出引入了熵之后的各种公式。

基本公式

熵用于度量随机变量的随机程度,例如,如果有一个硬币正面较重、反面较轻,那么抛这个硬币的时候有很大的概率为正面,所以抛硬币的结果比较容易预测,此时熵较小;如果这个硬币正反面比较均匀,那么抛硬币的时候无法准确预测是正面还是反面,此时熵较大。一个分布的熵的计算公式为:

$$H(P)=\underset{x \sim P}{\mathrm{E}}[-\log P(x)] \tag{1}$$

最终优化目标

我们的最终的优化目标是得到以下策略,式中 $\alpha$ 是一个系数。其意义在于被优化的策略不仅累计回报要大,它的熵也要大。

$$\pi^{*}=\arg \max _{\pi} \underset{\tau \sim \pi}{\mathrm{E}}\left[\sum_{t=0}^{\infty} \gamma^{t}\left(R\left(s_{t}, a_{t}, s_{t+1}\right)+\alpha H\left(\pi\left(\cdot | s_{t}\right)\right)\right)\right] \tag{2}$$

状态值函数

根据定义:策略的累计回报和熵都要大。值函数可以定义为:

$$V^{\pi}(s)=\underset{\tau \sim \pi}{\mathrm{E}}\left[\sum_{t=0}^{\infty} \gamma^{t}\left(R\left(s_{t}, a_{t}, s_{t+1}\right)+\alpha H\left(\pi\left(\cdot | s_{t}\right)\right)\right) | s_{0}=s\right] \tag{3}$$

状态-动作值函数

那么状态动作值函数为,式中 $P$ 为状态转移的分布。

$$Q^\pi(s,a)=\underset{s^{\prime} \sim P}{\mathrm{E}}\left[R\left(s, a, s^{\prime}\right)+\gamma V^{\pi}\left(s^{\prime}\right)\right] \tag{4}$$

由定义,值函数还可以写为:

$$\begin{aligned} V^{\pi}(s)&=\underset{a \sim \pi}{\mathrm{E}}\left[Q^{\pi}(s, a)\right]+\alpha H(\pi(\cdot | s)) \\ &=\underset{a \sim \pi}{\mathrm{E}}\left[Q^{\pi}(s, a)-\alpha \log \pi(a | s)\right] \end{aligned} \tag{5}$$

Q网络目标的计算

与TD3相同也要更新目标,目标的更新为:

$$y_q\left(s,a\right)=r(s,a)+\gamma V_{\psi’}(s’)$$

Q网络的更新

两个 Q 网络 $Q_{\phi1},Q_{\phi2}$ 的更新都使用同一个target: $y(s,a)$,其目标是:

$$\begin{aligned} \min_{\phi1}\frac{1}{2} \sum_{i}\left|Q_{\phi1}\left(s_{i}, a_{i}\right)-y_q\left(s_{i}, a_{i}\right)\right|^{2} \\ \min_{\phi2}\frac{1}{2} \sum_{i}\left|Q_{\phi2}\left(s_{i}, a_{i}\right)-y_q\left(s_{i}, a_{i}\right)\right|^{2} \end{aligned}$$

使用梯度下降,则迭代公式为:

$$\begin{aligned} \phi_1\leftarrow\phi_1-\alpha\sum\nolimits_{i} \frac{dQ_{\phi1}(s_i,a_i)}{d\phi_1}(Q_{\phi1}(s_i,a_i)-y_q(s_i,a_i)) \\ \phi_2\leftarrow\phi_2-\alpha\sum\nolimits_{i} \frac{dQ_{\phi2}(s_i,a_i)}{d\phi_2}(Q_{\phi2}(s_i,a_i)-y_q(s_i,a_i)) \end{aligned} \tag{6} $$

V网络的更新

由公式(5)值函数的近似可以写为:

$$V^{\pi}(s) \approx Q^{\pi}(s, \tilde{a})-\alpha \log \pi(\tilde{a} | s), \quad \tilde{a} \sim \pi_\theta(\cdot|s)$$

使用 double Q 技巧,则:

$$y_v(s)=\min\big(Q_{\phi1}(s_i,\tilde{a}_i),Q_{\phi2}(s_i,\tilde{a}_i)\big)-\alpha\log{\pi_\theta(\tilde{a}_i,s_i)}, \quad \tilde{a_i} \sim \pi_\theta(\cdot|s)$$

使用均方差损失来训练 $V_{\psi}$,则它的目标函数为:

$$\min_{\psi}\frac{1}{2} \sum_{i}\left|V_{\psi}\left(s_{i}\right)-y_v(s_i)\right|^{2}$$

在更新时我们并没有使用 replay buffer 中的动作,这些动作都是从当前的策略采集出来的。

使用梯度下降,则迭代公式为:

$$\begin{aligned} \psi\leftarrow\psi-\alpha\sum\nolimits_{i} \frac{dV_{\psi}(s_i,a_i)}{d\psi}(V_{\psi}(s_i)-y_v(s_i)) \end{aligned} \tag{7} $$

策略的更新

一个好的策略会使值函数尽可能的大,因此对于更新策略,其目标为:

$$\max_{\pi}\underset{a \sim \pi}{\mathrm{E}}\left[Q^{\pi}(s, a)-\alpha \log \pi(a | s)\right]$$

通常为了使用随机策略,我们会在策略网络的输出上再套一个高斯分布。假如策略网络的输出为 $\mu_\theta(s)$,则真实的输出为 $a\sim\mathcal{N}(\mu_\theta(s),\sigma^2)$。一般情况下,我们会让高斯分布的方差也是可学习的,这就是说使策略网络输出动作的均值也输出方差,此时策略 $\pi_\theta(s)$ 可写为:

$$a\sim\mathcal{N}(\mu_\theta(s),\sigma^2_\theta(s))$$

在 SAC 中使用了重参数化的技巧(reparameterization trick),这个技巧就是把一个分布拆成两个部分,一个部分负责确定性、一个部分负责随机性。例如一个单位高斯分布,均值0是它的确定部分,方差是他的随机部分。同时,由于高斯分布是无界的,因此在函数外面再套一个tanh函数,使输出的动作在一个范围之内。那么我们策略 $\pi_\theta(a|s)$ 可以写为:

$$\tilde{a}_{\theta}(s, \xi)=\tanh \left(\mu_{\theta}(s)+\sigma_{\theta}(s) \odot \xi\right), \quad \xi \sim \mathcal{N}(0, I) \tag{8}$$

因此,策略更新的目标为下式,注意这与TD3中一样只使用 $Q_{\phi1}$ 用于状态评估。

$$\max _{\theta} \sum\nolimits_i\bigg[Q_{\phi_{1}}\left(s_i, \tilde{a}_{\theta}(s_i, \xi)\right)-\alpha \log \pi_{\theta}\left(\tilde{a}_{\theta}(s_i, \xi) | s_i\right)\bigg],\quad \xi\sim \mathcal{N}(0, I) \tag{9}$$

综上我们给出SAC的算法流程。

SAC算法流程

  1. 初始化6个网络:$Q_{\phi1},Q_{\phi2},V_{\psi},V_{\psi’},\pi_{\theta}$,令$\psi’ \leftarrow \psi$
  2. 观察当前状态,使用 $\pi_{\theta}(s)$ 采集一个状态-动作-回报对 $\{s,a,r,s’\}$,并把这个样本加入 buffer-$\mathcal{B}$,令 $n\leftarrow 0$
  3. 从 $\mathcal{B}$ 中采集一个batch, $\{s_i,a_i,r_i,s’_{i}\}$,$n \leftarrow n+1$
  4. 同时使用 $Q_{\phi1},Q_{\phi2},V_{\psi’}$,计算target $$y_v(s_i)=\min\big(Q_{\phi1}(s_i,\tilde{a}_i),Q_{\phi2}(s_i,\tilde{a}_i)\big)-\alpha\log{\pi_\theta(\tilde{a}_i,s_i)}, \quad \tilde{a_i} \sim \pi_\theta(\cdot|s)$$ $$y_q\left(s_i,a\right)=r(s,a)+\gamma V_{\psi’}(s’)$$
  5. 更新Q网络: $$\begin{aligned} \phi_1\leftarrow\phi_1-\alpha\sum\nolimits_{i} \frac{dQ_{\phi1}(s_i,a_i)}{d\phi_1}(Q_{\phi1}(s_i,a_i)-y_q(s_i,a_i)) \\ \phi_2\leftarrow\phi_2-\alpha\sum\nolimits_{i} \frac{dQ_{\phi2}(s_i,a_i)}{d\phi_2}(Q_{\phi2}(s_i,a_i)-y_q(s_i,a_i)) \end{aligned} $$
  6. 更新V网络: $$\begin{aligned} \psi\leftarrow\psi-\alpha\sum\nolimits_{i} \frac{dV_{\psi}(s_i,a_i)}{d\psi}(V_{\psi}(s_i)-y_v(s_i)) \end{aligned} $$
  7. 更新策略网络 $\mu_{\theta}$,只使用 $Q_{\phi1}$ $$\theta \leftarrow \theta+\beta \nabla_\theta{\sum\nolimits_i\bigg[Q_{\phi_{1}}\left(s_i, \tilde{a}_{\theta}(s_i, \xi)\right)-\alpha \log \pi_{\theta}\left(\tilde{a}_{\theta}(s_i, \xi) | s_i\right)\bigg]}$$
  8. 利用Polyak Averaging更新 $\psi’$ $$\psi’ \leftarrow \rho\psi’+(1-\rho)\psi$$
  9. 如果 $n==N$,则返回2,否则返回3。